package 剑指II;

/**
 * @description:
 * @author: 小白白
 * @create: 2021-10-29
 **/

public class Jz009乘积小于K的子数组 {

    /**
     * 给定一个正整数数组 nums和整数 k ，请找出该数组内乘积小于 k 的连续的子数组的个数。
     * <p>
     * 示例 1:
     * 输入: nums = [10,5,2,6], k = 100
     * 输出: 8
     * 解释: 8 个乘积小于 100 的子数组分别为: [10], [5], [2], [6], [10,5], [5,2], [2,6], [5,2,6]。
     * 需要注意的是 [10,5,2] 并不是乘积小于100的子数组。
     * 示例 2:
     * 输入: nums = [1,2,3], k = 0
     * 输出: 0
     *  
     * 提示: 
     * 1 <= nums.length <= 3 * 104
     * 1 <= nums[i] <= 1000
     * 0 <= k <= 106
     *  
     * 注意：本题与主站 713 题相同：https://leetcode-cn.com/problems/subarray-product-less-than-k/ 
     */

    public int numSubarrayProductLessThanK(int[] nums, int k) {

        int left = 0;
        int right = 0;
        int sum = 1;
        int result = 0;

        while (right < nums.length) {

            sum *= nums[right];

            while (left <= right && sum >= k) {
                sum /= nums[left++];
            }

            result += (right - left + 1);

            right++;

        }

        return result;
    }

    public static void main(String[] args) {
        Jz009乘积小于K的子数组 n = new Jz009乘积小于K的子数组();
        int[] arr = {100};
        int result = n.numSubarrayProductLessThanK(arr, 100);
        System.out.println(result);
    }

}
